AWS CDK で Amazon Cognito の User pool app clients のデフォルトのリダイレクト URI が設定可能になりました

AWS CDK で Amazon Cognito の User pool app clients のデフォルトのリダイレクト URI が設定可能になりました

Clock Icon2024.08.17

こんにちは、製造ビジネステクノロジー部の若槻です。

少し前の AWS CDK のアップデートで、Amazon Cognito の User pool app clientsデフォルトのリダイレクト URI が設定可能になっていました。

https://github.com/aws/aws-cdk/releases/tag/v2.148.0

デフォルトのリダイレクト URI 機能自体は Amazon Cognito がリリースされた当初からあった機能のようですが、今回ようやく CDK で設定可能になったようです。
https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/user-pool-settings-client-apps.html#app-client-terms-callback-urls

今回、AWS CDK で Amazon Cognito の User pool app clients のデフォルトのリダイレクト URI を設定しつつ、その機能の挙動を改めて確認してみました。

やってみた

未設定の場合の挙動

まず比較のために、デフォルトのリダイレクト URI を設定しない場合の挙動を確認してみます。

AWS CDK で User pool app clients を作成します。

lib/cdk-sample-stack.ts
// デフォルトのリダイレクト URI を設定しない場合
import { aws_cognito, Stack } from 'aws-cdk-lib';
import { Construct } from 'constructs';

export class CdkSampleStack extends Stack {
  constructor(scope: Construct, id: string) {
    super(scope, id);

    const userPool = new aws_cognito.UserPool(this, 'UserPool', {
      selfSignUpEnabled: true,
      signInAliases: { email: true },
    });

    userPool.addClient('UserPoolClient', {
      generateSecret: false,
      oAuth: {
        callbackUrls: [
          'https://dev.classmethod.jp/',
          'https://classmethod.jp/',
        ],
        flows: { authorizationCodeGrant: true },
        scopes: [
          aws_cognito.OAuthScope.EMAIL,
          aws_cognito.OAuthScope.PROFILE,
          aws_cognito.OAuthScope.OPENID,
        ],
      },
    });

    userPool.addDomain('UserPoolDomain', {
      cognitoDomain: { domainPrefix: '20240816-cm-wakatsuki' },
    });
  }
}

コールバック URL には次の 2 つを指定しています。

上記を CDK デプロイし、マネジメントコンソールから app clients の Hosted UI を開いてみます。

https://20240816-cm-wakatsuki.auth.ap-northeast-1.amazoncognito.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxxx&response_type=code&scope=email+openid+profile&redirect_uri=https%3A%2F%2Fclassmethod.jp%2F

Hosted UI のリンクでは redirect_uri パラメーターに https://classmethod.jp/ が指定されているため、認証が成功するとそのページにリダイレクトされます。

一方で、次のように redirect_uri パラメーターを指定せずに Hosted UI を開いてみます。

https://20240816-cm-wakatsuki.auth.ap-northeast-1.amazoncognito.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxxx&response_type=code&scope=email+openid+profile

するとエラーとなりました。redirect_uri パラメーターを指定しない場合はリダイレクトできない挙動となるようです。

An error was encountered with the requested page.

デフォルトのリダイレクト URI を設定してみる

先程の挙動が、デフォルトのリダイレクト URI を設定することでどう変わるのか確認してみます。

addClient メソッドの oAuth.defaultRedirectUri でデフォルトのリダイレクト URI を設定します。

lib/cdk-sample-stack.ts
// デフォルトのリダイレクト URI を設定した場合
import { aws_cognito, Stack } from 'aws-cdk-lib';
import { Construct } from 'constructs';

export class CdkSampleStack extends Stack {
  constructor(scope: Construct, id: string) {
    super(scope, id);

    const userPool = new aws_cognito.UserPool(this, 'UserPool', {
      selfSignUpEnabled: true,
      signInAliases: { email: true },
    });

    userPool.addClient('UserPoolClient', {
      generateSecret: false,
      oAuth: {
        callbackUrls: [
          'https://dev.classmethod.jp/',
          'https://classmethod.jp/',
        ],
        /**
         * デフォルトのリダイレクト URI の指定
         */
        defaultRedirectUri: 'https://dev.classmethod.jp/',
        flows: { authorizationCodeGrant: true },
        scopes: [
          aws_cognito.OAuthScope.EMAIL,
          aws_cognito.OAuthScope.PROFILE,
          aws_cognito.OAuthScope.OPENID,
        ],
      },
    });

    userPool.addDomain('UserPoolDomain', {
      cognitoDomain: { domainPrefix: '20240816-cm-wakatsuki' },
    });
  }
}

ここで設定した URI は下記です。コールバック URLs のうちの一つですが、先ほど確認した未設定の場合の Hosted UI のリンクで redirect_uri パラメーターに既定で指定されていなかった方の URL となります。

上記を CDK デプロイし、redirect_uri パラメーターを指定せずに Hosted UI を開いてみます。

https://20240816-cm-wakatsuki.auth.ap-northeast-1.amazoncognito.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxxx&response_type=code&scope=email+openid+profile

すると今度はデフォルトのリダイレクト URI で指定したページにリダイレクトされました。

もちろん、デフォルトでないコールバック URL(https://classmethod.jp/)を指定した場合は、その URL にリダイレクトされる挙動となりました。

ちなみにマネジメントコンソールから app clients の Hosted UI のリンクを確認してみると、こちらも redirect_uri パラメーターが https://dev.classmethod.jp/ となっていました。

https://20240816-cm-wakatsuki.auth.ap-northeast-1.amazoncognito.com/oauth2/authorize?client_id=xxxxxxxxxxxxxxxx&response_type=code&scope=email+openid+profile&redirect_uri=https%3A%2F%2Fdev.classmethod.jp%2F

defaultRedirectUri に不正な URI を指定してみる

不正な形式の URI の場合

次のように不正な形式の URI を指定してみます。

userPool.addClient('UserPoolClient', {
  generateSecret: false,
  oAuth: {
    callbackUrls: ['https://dev.classmethod.jp/', 'https://classmethod.jp/'],
    /**
     * デフォルトのリダイレクト URI の指定
     */
    defaultRedirectUri: 'ほげほげ', // 不正な形式の URI
    flows: { authorizationCodeGrant: true },
    scopes: [
      aws_cognito.OAuthScope.EMAIL,
      aws_cognito.OAuthScope.PROFILE,
      aws_cognito.OAuthScope.OPENID,
    ],
  },
});

CDK Synth をすると Error: defaultRedirectUri must be included in callbackUrls. というエラーとなりました。

callbackUrls に含まれない URL の場合

次のように callbackUrls に含まれない URL を指定してみます。

userPool.addClient('UserPoolClient', {
  generateSecret: false,
  oAuth: {
    callbackUrls: ['https://dev.classmethod.jp/', 'https://classmethod.jp/'],
    /**
     * デフォルトのリダイレクト URI の指定
     */
    defaultRedirectUri: 'https://example.com/', // callbackUrls に含まれない URL
    flows: { authorizationCodeGrant: true },
    scopes: [
      aws_cognito.OAuthScope.EMAIL,
      aws_cognito.OAuthScope.PROFILE,
      aws_cognito.OAuthScope.OPENID,
    ],
  },
});

CDK Synth をすると Error: defaultRedirectUri must be included in callbackUrls. というエラーとなりました。

指定する URI のバリデーションは CDK の合成時にちゃんと行われるようです。

おわりに

AWS CDK で Amazon Cognito の User pool app clients のデフォルトのリダイレクト URI が設定可能になっていたので共有しました。

認証リクエストに redirect_uri パラメーターが含まれていない場合でもユーザーにエラーを表示させない、という利点はあるため設定しておくと良いのではないでしょうか。

以上

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.